其他
内存加载Dll
几年前写过一份内存加载PE文件的项目,支持exe和dll,但不支持mfc dll
去年整理了一下重新写了代码,省略了一些功能,只用来加载dll
编译环境:
vs2005
vc6.0
支持:
标准Win32 Dll
MFC Dll
易语言Dll
其他Dll(这个没怎么测试)
不支持:
加密Dll
压缩Dll(具体看压缩流程)
File: include/ldr.h
/* __ldr_header__ */
typedef PVOID (__stdcall *malloc_t) (ULONG);
typedef VOID (__stdcall *free_t) (PVOID);
PVOID LdrLoadImage (PVOID Buffer, DWORD Size, malloc_t m = NULL, free_t f = NULL);
PVOID LdrGetProcAddress (PVOID Addr, LPCSTR Name);
VOID LdrFreeImage (PVOID Addr);
Dll处理接口
PVOID LdrLoadImage (PVOID Buffer, DWORD Size, malloc_t m = NULL, free_t f = NULL);
PVOID LdrGetProcAddress (PVOID Addr, LPCSTR Name);
VOID LdrFreeImage (PVOID Addr);
之前发过一个帖子,用的易语言封装了编译的lib测试的内存加载Dll
项目源码(阅读原文查看)
顺便说一下,对MFC Dll的支持主要是处理了GetModuleHandle相关的API,做了一层中间层。
File:image/traps/GetModuleHandleW.asm
.386
.Model flat, StdCall
Option CaseMap: none
Include trap.inc
.Const
.Data?
.Data
.Code
GetModuleHandleWTrap Proc Uses Ebx Ecx Edx Esi Edi, lpModuleName: Ptr WCHAR
; Mov Esi, 0x********
Mov_Esi_Information
; Pointer to ImageInformation
Assume Esi: Ptr ImageInformation
.If lpModuleName == 0
Push 0
Call [Esi].traps[SizeOf ImageTrap * TRAP_ID_GET_MODULE_HANDLE_W].procedure
.Else
Lea Ebx, [Esi].ModuleNameW
Push Ebx
Push lpModuleName
Call [Esi].apis.lstrcmpiW
Cmp Eax, 0
Je __COPY
Lea Ebx, [Esi].ModuleBaseNameW
Push Ebx
Push lpModuleName
Call [Esi].apis.lstrcmpiW
Cmp Eax, 0
Jne __CALL
__COPY:
Mov Eax, [Esi].imagebase
Jmp @F
__CALL:
Push lpModuleName
Call [Esi].traps[SizeOf ImageTrap * TRAP_ID_GET_MODULE_HANDLE_W].procedure
@@:
.EndIf
Return Eax
GetModuleHandleWTrap EndP
End
肯定有人觉得为什么不支持x64,主要还是自己平时没那么时间弄,要上班,之前一直想迭代一下支持压缩加密啥的,也一直搁着,哎~
看雪ID:KamiBoy
bbs.pediy.com/user-589827
本文由看雪论坛 KamiBoy 原创
转载请注明来自看雪社区